package cn.yh.nft.turbo.base.utils;

import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.ValidationException;
import jakarta.validation.Validator;
import org.hibernate.validator.HibernateValidator;

import java.util.Set;

/**
 * @ClassName: BeanValidator
 * @Author: 草莓爱上啵啵
 *  参数校验工具
 *
 */
public class BeanValidator {

    /**
     * 定义一个静态的 Validator 实例 validator，用于执行校验操作。
     * Validation.byProvider(HibernateValidator.class) 指定使用 Hibernate Validator 作为校验提供者。
     * .configure().failFast(true) 配置校验器在遇到第一个校验失败时立即停止校验（快速失败模式）。
     * .buildValidatorFactory().getValidator() 构建一个 ValidatorFactory 并从中获取 Validator 实例。
     */
    private static Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(true)
            .buildValidatorFactory().getValidator();


    /**
     * @param object object
     * @param groups groups
     * 定义一个公共静态方法 validateObject，用于校验传入的 Java Bean。
     * 参数 object 是需要校验的对象。
     * 参数 groups 是校验组，可以是多个校验组。
     * 方法可能会抛出 ValidationException，表示校验失败。
     */
    public static void validateObject(Object object, Class<?>... groups) throws ValidationException {

        //使用 validator.validate(object, groups) 方法校验传入的 object。
        //返回一个 Set<ConstraintViolation<Object>>，其中包含所有校验失败的约束违规信息。
        Set<ConstraintViolation<Object>>constraintViolations = validator.validate(object,groups);

        //检查 constraintViolations 集合中是否有校验失败的约束违规。
        //stream().findFirst().isPresent() 用于判断集合中是否存在至少一个校验失败的约束违规。
        if(constraintViolations.stream().findFirst().isPresent()){
            //如果存在校验失败的约束违规，抛出 ValidationException 异常。
            throw new ValidationException(constraintViolations.stream().findFirst().get().getMessage());
        }

    }
}
